/**
 * 内存管理器
 * 用于处理视频资源、组件生命周期和缓存管理
 */

// 默认配置
const defaultConfig = {
  // 视频配置
  video: {
    preloadCount: 2,      // 预加载视频数量
    cacheSize: 100,       // 缓存大小(MB)
    autoPlay: true,       // 是否自动播放
    loop: true,           // 是否循环播放
  },
  
  // 评论配置
  comment: {
    pageSize: 10,         // 每页评论数
    maxReplies: 3,        // 默认显示回复数
    loadMoreInterval: 500 // 加载更多间隔(ms)
  },
  
  // 缓存配置
  cache: {
    maxSize: 50,          // 最大缓存大小(MB)
    expireTime: 3600,     // 缓存过期时间(秒)
    checkInterval: 300    // 检查间隔(秒)
  }
};

class MemoryManager {
  constructor() {
    this.videoContexts = new Map();  // 视频上下文
    this.timers = new Set();         // 定时器集合
    this.listeners = new Map();      // 事件监听器
    this.cache = new Map();          // 缓存数据
    this.config = defaultConfig;     // 配置
  }

  /**
   * 初始化内存管理器
   * @param {Object} context - Vue组件实例
   * @param {Object} config - 自定义配置
   */
  init(context, config = {}) {
    this.context = context;
    this.config = { ...defaultConfig, ...config };
    
    // 初始化定时检查
    this.startCacheCheck();
    
    // 监听页面隐藏事件
    this.addPageListener();
  }

  /**
   * 添加视频上下文
   * @param {String} id - 视频ID
   * @param {Object} context - 视频上下文
   */
  addVideoContext(id, context) {
    this.videoContexts.set(id, context);
  }

  /**
   * 移除视频上下文
   * @param {String} id - 视频ID
   */
  removeVideoContext(id) {
    const context = this.videoContexts.get(id);
    if (context) {
      context.stop();
      this.videoContexts.delete(id);
    }
  }

  /**
   * 添加定时器
   * @param {Number} timer - 定时器ID
   */
  addTimer(timer) {
    this.timers.add(timer);
  }

  /**
   * 清除所有定时器
   */
  clearTimers() {
    this.timers.forEach(timer => {
      clearTimeout(timer);
      clearInterval(timer);
    });
    this.timers.clear();
  }

  /**
   * 添加事件监听器
   * @param {String} event - 事件名称
   * @param {Function} handler - 事件处理函数
   */
  addListener(event, handler) {
    if (!this.listeners.has(event)) {
      this.listeners.set(event, new Set());
    }
    this.listeners.get(event).add(handler);
  }

  /**
   * 移除事件监听器
   * @param {String} event - 事件名称
   * @param {Function} handler - 事件处理函数
   */
  removeListener(event, handler) {
    if (this.listeners.has(event)) {
      this.listeners.get(event).delete(handler);
    }
  }

  /**
   * 清除所有事件监听器
   */
  clearListeners() {
    this.listeners.clear();
  }

  /**
   * 添加缓存数据
   * @param {String} key - 缓存键
   * @param {*} value - 缓存值
   * @param {Number} expireTime - 过期时间(秒)
   */
  setCache(key, value, expireTime = this.config.cache.expireTime) {
    this.cache.set(key, {
      value,
      expireTime: Date.now() + expireTime * 1000
    });
  }

  /**
   * 获取缓存数据
   * @param {String} key - 缓存键
   * @returns {*} 缓存值
   */
  getCache(key) {
    const item = this.cache.get(key);
    if (item && item.expireTime > Date.now()) {
      return item.value;
    }
    this.cache.delete(key);
    return null;
  }

  /**
   * 清理过期缓存
   */
  clearExpiredCache() {
    const now = Date.now();
    for (const [key, item] of this.cache.entries()) {
      if (item.expireTime <= now) {
        this.cache.delete(key);
      }
    }
  }

  /**
   * 开始缓存检查
   */
  startCacheCheck() {
    const timer = setInterval(() => {
      this.clearExpiredCache();
    }, this.config.cache.checkInterval * 1000);
    
    this.addTimer(timer);
  }

  /**
   * 添加页面事件监听
   */
  addPageListener() {
    // 监听页面隐藏事件
    document.addEventListener('visibilitychange', () => {
      if (document.hidden) {
        this.pauseAllVideos();
      }
    });

    // 监听页面卸载事件
    window.addEventListener('beforeunload', () => {
      this.cleanup();
    });
  }

  /**
   * 暂停所有视频
   */
  pauseAllVideos() {
    for (const context of this.videoContexts.values()) {
      context.pause();
    }
  }

  /**
   * 清理所有资源
   */
  cleanup() {
    // 停止所有视频
    for (const [id] of this.videoContexts.entries()) {
      this.removeVideoContext(id);
    }

    // 清除所有定时器
    this.clearTimers();

    // 清除所有事件监听器
    this.clearListeners();

    // 清理缓存
    this.cache.clear();

    // 重置状态
    this.videoContexts.clear();
    this.timers.clear();
    this.listeners.clear();
    this.cache.clear();
  }
}

// 创建单例
const memoryManager = new MemoryManager();

export default memoryManager; 